--- @since 25.4.8

-- 获取当前活动标签页的工作目录，使用 ya.sync 包装确保同步执行
local root = ya.sync(function() return cx.active.current.cwd end)

-- 定义错误通知函数，用于显示错误信息
local function fail(content)
	return ya.notify {
		title = "VCS Files",          -- 通知标题
		content = content,            -- 通知内容
		timeout = 5,                  -- 通知超时时间（秒）
		level = "error",              -- 通知级别（错误）
	}
end

-- 定义插件的入口函数
local function entry()
	-- 获取当前工作目录
	local root = root()
	-- 执行 git diff 命令，获取相对于 HEAD 的修改文件
	local output, err = Command("git")
		:cwd(tostring(root))          -- 设置工作目录为当前 Git 仓库根目录
		:args({ "diff", "--name-only", "HEAD" }) -- 使用 git diff 命令获取修改文件名
		:output()                     -- 执行命令并获取输出

	-- 检查命令执行是否出错
	if err then
		return fail("Failed to run `git diff`, error: " .. err) -- 如果出错，显示错误通知
	elseif not output.status.success then
		return fail("Failed to run `git diff`, stderr: " .. output.stderr) -- 如果命令失败，显示错误信息
	end

	-- 创建一个新的文件面板 ID
	local id = ya.id("ft")
	-- 进入一个新的搜索上下文，名称为 "Git changes"
	local cwd = root:into_search("Git changes")
	-- 发送 cd 事件，切换到新的工作目录
	ya.mgr_emit("cd", { Url(cwd) })
	-- 发送 update_files 事件，初始化文件面板
	ya.mgr_emit("update_files", { op = fs.op("part", { id = id, url = Url(cwd), files = {} }) })

	-- 收集修改的文件
	local files = {}
	for line in output.stdout:gmatch("[^\r\n]+") do -- 遍历 git diff 的输出每一行
		local url = cwd:join(line) -- 构建文件的完整路径
		local cha = fs.cha(url, true) -- 获取文件的状态
		if cha then
			-- 将文件添加到文件列表
			files[#files + 1] = File { url = url, cha = cha }
		end
	end
	-- 发送 update_files 事件，更新文件面板显示修改的文件
	ya.mgr_emit("update_files", { op = fs.op("part", { id = id, url = Url(cwd), files = files }) })
	-- 发送 update_files 事件，标记文件面板更新完成
	ya.mgr_emit("update_files", { op = fs.op("done", { id = id, url = cwd, cha = Cha { kind = 16 } }) })
end

-- 返回插件的入口函数
return { entry = entry }